package com.tender.page;

import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.Data;
import org.springframework.util.CollectionUtils;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

@Data
public class PageDTO<T> implements Serializable {

    /**
     * 总条数
     */
    private Long total;

    /**
     * 总页数
     */
    private Long pages;

    /**
     * 具体 T 类型的数据集合
     */
    private List<T> list;


    public static <PO, VO> PageDTO<VO> of(IPage<PO> page, Function<PO, VO> convertor) {
        PageDTO<VO> dto = new PageDTO<>();
        dto.setTotal(page.getTotal());
        dto.setPages(page.getPages());
        if (CollectionUtils.isEmpty(page.getRecords())) {
            dto.setList(Collections.emptyList());
            return dto;
        }
        dto.setList(page.getRecords().stream().map(convertor).collect(Collectors.toList()));

        return dto;
    }

    public static <PO, VO> PageDTO<VO> of(PageDTO<PO> page, Function<PO, VO> convertor) {
        PageDTO<VO> dto = new PageDTO<>();
        dto.setTotal(page.getTotal());
        dto.setPages(page.getPages());
        if (CollectionUtils.isEmpty(page.getList())) {
            dto.setList(Collections.emptyList());
            return dto;
        }
        dto.setList(page.getList().stream().map(convertor).collect(Collectors.toList()));

        return dto;
    }

    public static <T> PageDTO<T> emptyPageDTO() {
        PageDTO<T> pageDTO = new PageDTO<>();
        pageDTO.setList(new ArrayList<>());
        pageDTO.setTotal(0L);
        pageDTO.setPages(0L);

        return pageDTO;
    }

}
